package com.mxf.code.responsibility_chain;

import com.mxf.code.request.IRequest;

/**
 * 为什么需要责任链模式？
 * 1.业务场景：下订单，下订单接口：逻辑校验参数：非空，安全，黑名单，规则拦截
 * 2.解决思路：
 *  a：可以使用简单的异常校验，依次校验参数，如果参数不符合规则则抛出自定义异常
 *      异常的设计初衷是为了解决程序运行中的各种意外情况
 *  b：使用责任链模式
 * 3.责任链模式的定义：
 *  想让一个以上对象有机会处理某个请求的时候，可以使用责任链模式
 *  责任链模式为请求创建了一个接收对象的链，执行链上有很多个个对象节点，每个对象节点都有机会（条件匹配）处理请求事务
 *  如果某哦个对象的处理节点处理完了，可以根据实际业务需要传递给下一个节点继续处理或返回处理完毕，这种模式给予请求的类型，
 *  对请求的发送者和接收者进行解耦
 *  它让多个处理（对象节点）都有机会处理该请求，直到其中某个处理成功为止，责任链模式可以把多个处理器串成链，然后让请求在链上传递
 *
 */
public abstract class AbstractHandler {

    //责任链中的下一个对象
    private AbstractHandler nextHandler;

    /**
     * 责任链的下一个对象
     */
    public void setNextHandler(AbstractHandler nextHandler){
        this.nextHandler = nextHandler;
    }

    /**
     * 具体参数拦截逻辑,给子类去实现
     */
    public void filter(IRequest request, IRequest response) {
        doFilter(request, response);
        if (getNextHandler() != null) {
            getNextHandler().filter(request, response);
        }
    }

    public AbstractHandler getNextHandler() {
        return nextHandler;
    }

     abstract void doFilter(IRequest filterRequest, IRequest response);

}